"""
剪贴板工具模块
用于Windows平台的图片剪贴板操作
"""

import io
import numpy as np
from PIL import Image
from typing import Optional
import win32clipboard
import win32con

from .logger import get_logger


class ClipboardUtils:
    """剪贴板工具类"""
    
    logger = get_logger(__name__)
    
    @staticmethod
    def copy_image_to_clipboard(image: np.ndarray) -> bool:
        """
        将图片复制到剪贴板
        
        Args:
            image: numpy数组格式的图片 (RGB或RGBA)
        
        Returns:
            bool: 是否成功
        """
        try:
            # 转换为PIL Image
            if image.shape[2] == 4:  # RGBA
                pil_image = Image.fromarray(image, 'RGBA')
            else:  # RGB
                pil_image = Image.fromarray(image, 'RGB')
            
            # 将图片转换为DIB格式（Windows标准位图格式）
            output = io.BytesIO()
            
            # 保存为BMP格式到内存
            pil_image.convert('RGB').save(output, 'BMP')
            data = output.getvalue()[14:]  # 跳过BMP文件头（14字节）
            output.close()
            
            # 写入剪贴板
            win32clipboard.OpenClipboard()
            win32clipboard.EmptyClipboard()
            win32clipboard.SetClipboardData(win32con.CF_DIB, data)
            win32clipboard.CloseClipboard()
            
            ClipboardUtils.logger.info(f"图片已复制到剪贴板，尺寸: {image.shape[1]}x{image.shape[0]}")
            return True
            
        except Exception as e:
            ClipboardUtils.logger.error(f"复制图片到剪贴板失败: {e}", exc_info=True)
            return False
    
    @staticmethod
    def copy_png_to_clipboard(image: np.ndarray) -> bool:
        """
        将PNG图片（带透明通道）复制到剪贴板
        
        Args:
            image: numpy数组格式的图片 (RGBA)
        
        Returns:
            bool: 是否成功
        """
        try:
            # 转换为PIL Image
            if image.shape[2] == 4:  # RGBA
                pil_image = Image.fromarray(image, 'RGBA')
            else:  # RGB
                pil_image = Image.fromarray(image, 'RGB')
            
            # 先尝试使用DIB格式（大多数应用支持）
            output = io.BytesIO()
            pil_image.convert('RGB').save(output, 'BMP')
            bmp_data = output.getvalue()[14:]
            output.close()
            
            # 同时保存PNG格式（支持透明通道）
            png_output = io.BytesIO()
            pil_image.save(png_output, 'PNG')
            png_data = png_output.getvalue()
            png_output.close()
            
            # 注册PNG格式
            CF_PNG = win32clipboard.RegisterClipboardFormat("PNG")
            
            # 写入剪贴板（多种格式）
            win32clipboard.OpenClipboard()
            win32clipboard.EmptyClipboard()
            
            # 设置BMP格式（兼容性最好）
            win32clipboard.SetClipboardData(win32con.CF_DIB, bmp_data)
            
            # 设置PNG格式（保留透明通道）
            win32clipboard.SetClipboardData(CF_PNG, png_data)
            
            win32clipboard.CloseClipboard()
            
            ClipboardUtils.logger.info(
                f"PNG图片已复制到剪贴板（含透明通道），尺寸: {image.shape[1]}x{image.shape[0]}"
            )
            return True
            
        except Exception as e:
            ClipboardUtils.logger.error(f"复制PNG图片到剪贴板失败: {e}", exc_info=True)
            return False
    
    @staticmethod
    def has_clipboard_support() -> bool:
        """
        检查系统是否支持剪贴板操作
        
        Returns:
            bool: 是否支持
        """
        try:
            win32clipboard.OpenClipboard()
            win32clipboard.CloseClipboard()
            return True
        except Exception as e:
            ClipboardUtils.logger.warning(f"剪贴板不可用: {e}")
            return False

